#!/bin/bash

#Variables generales
RESERVASOK=$PROCDIR"/reservas.ok"
RESERVASNOK=$PROCDIR"/reservas.nok"

BASE="$( cd "$( dirname "${BASH_SOURCE[0]}")" && pwd )"
MOVER="${BASE}/Mover_B";
VALIDARFECHA="${BASE}/ValidarFecha";
VALIDARHORA="${BASE}/ValidarHora";
VALIDARHORA="${BASE}/ValidarHora";
GRABAR="${BASE}/Grabar_L"
log="Reservar_B"

declare -A arrayDisponibilidades

<<ValidarArchivo
Funcion que valida el archivo.
$1 El path del mismo
Devuelve 0 si el archivo es valido y 1 en caso contrario. Si hay error, lo escribe en el log.
ValidarArchivo
function validarArchivo(){
	#Verifica si el archivo esta duplicado
	if [ -f $PROCDIR/$1 ];  then
		echo "Se rechaza el archivo por estar DUPLICADO"
		return
	fi

	#Verifica si el archivo esta vacio
	if [ ! -s $ACEPDIR/$1 ];  then
		echo "Se rechaza el archivo por estar VACIO"
		return
	fi

	echo "0"
}


<<ValidarRegistro
Funcion que valida el registro.
$1 El path del mismo
Devuelve 0 si el registro es valido.
ValidarRegistro
function validarRegistro(){

	#
	# Verifica si el registro tiene un formato valido
	#

	local regExpRegistro="^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*"
	if [[ ! $1 =~ $regExpRegistro ]];
	then
		echo "Registro con formato invalido"
		return	
	fi

	#
	#Verifica si la fecha tiene el formato valido
	#	

	#Expresion regular que obtiene el 2do campo (la fecha) del registro
	local regExpFecha="^[^;]*;([^;]*);"

	#Verifica si la fecha es valida frente a las siguientes restricciones:
	# - Formato dd/mm/yyyy
	# - No se toman funciones vencidas
	# - No se toman funciones para el mismo dia	
	# - No se toman funciones para el dia siguiente
	# - No se toman funciones con mas de 30 dias de anticipacion
	if [[ $1 =~ $regExpFecha ]];
        then	

		local diaActual=`date "+%d"`
		local mesActual=`date "+%m"`
		local anioActual=`date "+%Y"`
		
		
		local regExpSeparadorFecha="(..)/(..)/(....)"		
                local fecha=${BASH_REMATCH[1]}
		if [[ $fecha =~ $regExpSeparadorFecha ]];
		then
			local diaLeido=${BASH_REMATCH[1]}
			local mesLeido=${BASH_REMATCH[2]}
			local anioLeido=${BASH_REMATCH[3]}		
		fi

		#Valida que la fecha tenga un formato valido
		local fechaFormatoValido=`"${VALIDARFECHA}" "$fecha"`
		if [ ! "$fechaFormatoValido" = "0" ]; then
			echo "Fecha invalida"
			return
		fi

		#Valida que la fecha no este vencida, no sea el mismo dia, o el siguiente.
		if [ $anioLeido -lt $anioActual ];
		then
			echo "Anio vencido"
			return
		fi
		if [ $anioLeido -gt $anioActual ];
		then
			echo "No se toman reservas con mas de 30 dias de anticipacion (por anio)"
			return				
		fi
		if [ $mesLeido -lt $mesActual ];
		then
			echo "Mes vencido"
			return
		fi
	
		if [ $mesLeido -gt $mesActual ];
		then
			local mesSiguiente=$mesActual;
			let mesSiguiente=mesSiguiente+1

			#Si es una cifra, le agrega un cero adelante.
			if [ $mesSiguiente -lt 10 ];
			then
				mesSiguiente=0$mesSiguiente
			fi

			if [ $mesLeido -gt $mesSiguiente ];
				then					
				echo "No se toman reservas con mas de 30 dias de anticipacion (por mes)"	
				return				
			fi

			if [ $mesLeido -eq $mesSiguiente  -a $diaLeido -gt $diaActual ];
			then					
				echo "No se toman reservas con mas de 30 dias de anticipacion (Por dia)"	
				return				
			fi
		fi

		if [ $mesLeido -eq $mesActual ];
		then
			if [ $diaLeido -lt $diaActual ];
			then
				echo "Dia vencido"
				return
			fi
			if [ $diaLeido -eq $diaActual ];
			then
				echo "Mismo dia"	
				return				
			fi
		
			local diaSiguiente=$diaActual;
			let diaSiguiente=diaSiguiente+1
			#Si es una cifra, le agrega un cero adelante.
			if [ $diaSiguiente -lt 10 ];
			then
				diaSiguiente=0$diaSiguiente
			fi

			if [ $diaLeido -eq $diaSiguiente ];
			then
				echo "Dia siguiente rechazo"
				return
			fi
		fi
	fi


	#
	# Verifica si la hora tiene un formato valido
	#

	#Expresion regular que obtiene el 3er campo (la hora) del registro
	local regExpHora="^[^;]*;[^;]*;([^;]*);"

	#Verifica si la hora es valida frente a las siguientes restricciones.Formato hh:mm
	if [[ $1 =~ $regExpHora ]];
        then	
		local hora=${BASH_REMATCH[1]}

		#Valida que la hora tenga un formato valido
		local horaFormatoValido=`"${VALIDARHORA}" "$hora"`
		if [ ! "$horaFormatoValido" = "0" ]; then
			echo "Hora invalida"
			return
		fi
        fi
	echo "0"
	return;
}

<<BusquedaCombo
Funcion que busca si existe el combo de la obra o sala del registro y archivo recibido por parametro.
$1 El registro en cuestion
$2 El archivo al que pertenece el registro
Devuelve 0 si el combo existe.
BusquedaCombo
function busquedaCombo(){

	regExpFechayHora="^[^;]*;([^;]*);([^;]*);"
	if [[ $1 =~ $regExpFechayHora ]];
	then
		local fecha=${BASH_REMATCH[1]}
		local hora=${BASH_REMATCH[2]}
	fi

	regExpIdArchivo="^([^-]*)-"
	if [[ $2 =~ $regExpIdArchivo ]];
	then
		local idArchivo=${BASH_REMATCH[1]}
	fi
			
	# Busco por obra
	local resultadoGrepObra=`grep "^[^;]*;$idArchivo;$fecha;$hora" $PROCDIR"/combos.dis"`
	
	# Busco por sala	
	local resultadoGrepSala=`grep "^[^;]*;[^;]*;$fecha;$hora;$idArchivo" $PROCDIR"/combos.dis"`

	if [ ! "$resultadoGrepObra" -a ! "$resultadoGrepSala" ];
	then
		echo "No existe el evento solicitado"
		return
	fi
	echo "0"
	return;
}


<<DeterminarDisponibilidad
Funcion que determina si se puede cumplir con la disponibilidad requerida del registro que se recibe por parametro.
$1 El registro en cuestion
$2 El archivo que almacena el registro
Devuelve 0 si se puede cumplir con la disponibilidad requerida.
DeterminarDisponibilidad
function determinarDisponibilidad(){
	registroCombo=`busquedaCombo $1 $2`			
	regExpFechayHora="^[^;]*;([^;]*);([^;]*);"
	if [[ $1 =~ $regExpFechayHora ]];
	then
		local fecha=${BASH_REMATCH[1]}
		local hora=${BASH_REMATCH[2]}
	fi

	regExpIdArchivo="^([^-]*)-"
	if [[ $2 =~ $regExpIdArchivo ]];
	then
		local idArchivo=${BASH_REMATCH[1]}
	fi
			
	# Busco por obra
	local resultadoGrep=`grep "^[^;]*;$idArchivo;$fecha;$hora" $PROCDIR"/combos.dis"`
	
	if [ ! $resultadoGrep ];
	then
		# Busco por sala	
		local resultadoGrep=`grep "^[^;]*;[^;]*;$fecha;$hora;$idArchivo" $PROCDIR"/combos.dis"`
	fi

	regExpCombo="^([^;]*);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;([^;]*);"
	if [[ $resultadoGrep =~ $regExpCombo ]];
	then
		local idCombo=${BASH_REMATCH[1]}
		local disponibilidadCombo=${BASH_REMATCH[2]}
	fi
	echo "$idCombo;$disponibilidadCombo"
	return;
}



<<GuardarNOK
Funcion que guarda en el archivo de reservas nok.
$1 El registro en cuestion
$2 El mensaje de error
$3 el archivo del registro
GuardarNOK
function guardarNOK(){
	regExpCamposRegistro="^([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;\r]*)"
	regExpIdArchivo="^([^-]*)-([^-]*)"
	local fechaActual=`date "+%d/%m/%Y %H:%M"`
	if [[ $1 =~ $regExpCamposRegistro ]];
	then
		local solicitante=${BASH_REMATCH[1]}
		local fecha=${BASH_REMATCH[2]}
		local hora=${BASH_REMATCH[3]}
		local fila=${BASH_REMATCH[4]}
		local butaca=${BASH_REMATCH[5]}
		local cantidadButacas=${BASH_REMATCH[6]}
		local seccion=${BASH_REMATCH[7]}
		local seccionSinFinDeLinea=`echo -e "$seccion" | tr -d "\n\r"`
	fi	
	if [[ $3 =~ $regExpIdArchivo ]];
	then
		local idArchivo=${BASH_REMATCH[1]}
		local mail=${BASH_REMATCH[2]}
	fi
	idSala="falta sala"
	idObra="falta obra"
	let resultadoPar=idArchivo%2
	if [ $resultadoPar -eq 0 ];
	then
		idSala=$idArchivo
	else
		idObra=$idArchivo
	fi
	echo "$solicitante;$fecha;$hora;$fila;$butaca;$cantidadButacas;$seccionSinFinDeLinea;$2;$idSala;$idObra;$mail;$fechaActual;$USER" >> $RESERVASNOK
}



<<GuardarOK
Funcion que guarda en el archivo de reservas ok.
$1 El registro en cuestion
$2 el archivo del registro
GuardarOK
function guardarOK(){
	regExpCamposRegistro="^([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;\r]*)"
	regExpIdArchivo="^([^-]*)-([^-]*)"
	local fechaActual=`date "+%d/%m/%Y %H:%M"`
	if [[ $1 =~ $regExpCamposRegistro ]];
	then
		local solicitante=${BASH_REMATCH[1]}
		local fecha=${BASH_REMATCH[2]}
		local hora=${BASH_REMATCH[3]}
		local fila=${BASH_REMATCH[4]}
		local butaca=${BASH_REMATCH[5]}
		local cantidadButacas=${BASH_REMATCH[6]}
		local seccion=${BASH_REMATCH[7]}
		local seccionSinFinDeLinea=`echo -e "$seccion" | tr -d "\n\r"`
	fi	
	if [[ $2 =~ $regExpIdArchivo ]];
	then
		local idArchivo=${BASH_REMATCH[1]}
		local mail=${BASH_REMATCH[2]}
	fi

	# Busco por idCombo: $3
	local resultadoGrepCombo=`grep "^$3;" $PROCDIR"/combos.dis"`
	regExpCombo="^([^;]*);([^;]*);[^;]*;[^;]*;([^;]*);"
	if [[ $resultadoGrepCombo =~ $regExpCombo ]];
	then
		local idCombo=${BASH_REMATCH[1]}
		local idObra=${BASH_REMATCH[2]}
		local idSala=${BASH_REMATCH[3]}
	fi

	# Busco por idSala el nombre de la sala en maestro de salas
	local resultadoGrepSalas=`grep "^$idSala;" $MAEDIR"/salas.mae"`
	local nombreSala=`echo $resultadoGrepSalas | cut -d ";" -f 2`

	# Busco por idObra el nombre de la obra en maestro de obras
	local resultadoGrepObras=`grep "^$idObra;" $MAEDIR"/obras.mae"`
	local nombreObra=`echo $resultadoGrepObras | cut -d ";" -f 2`

	echo "$idObra;$nombreObra;$fecha;$hora;$idSala;$nombreSala;$cantidadButacas;$idCombo;$solicitante;$cantidadButacas;$mail;$fechaActual;$USER" >> $RESERVASOK
}



cantArchivosAcepDir=`ls $ACEPDIR | wc -l`
"${GRABAR}" $log "Inicio de Reservar_B y cantidad de archivos de acepdir es $cantArchivosAcepDir"

registrosTotal=0
registrosOK=0
registrosNOK=0
cantArchivos=0
#Recorro archivos de ACEPDIR y los proceso
for archivo in `ls $ACEPDIR` 
do	
	"${GRABAR}" $log "Archivo a procesar en ACEPDIR: "$archivo	
	let cantArchivos=cantArchivos+1
	archivoValido=`validarArchivo $archivo`
	if [ "$archivoValido" = "0" ]; 
	then
		IFSviejo=$IFS 
		IFS=$'\n' 
		registrosTotalParcial=0
		registrosOKParcial=0
		registrosNOKParcial=0
		for registro in `cat $ACEPDIR/$archivo`
		do
			let registrosTotal=registrosTotal+1
			let registrosTotalParcial=registrosTotalParcial+1
			registroValido=`validarRegistro $registro`
			if [ "$registroValido" = "0" ]; then
				# Registro valido
				resBusquedaCombo=`busquedaCombo $registro $archivo`
				if [ "$resBusquedaCombo" = "0" ];
				then
					disponibilidadValida=`determinarDisponibilidad $registro $archivo`
					regExpDisp="([^;]*);([^;]*)"
					if [[ $disponibilidadValida =~ $regExpDisp ]];
					then
						idCombo=${BASH_REMATCH[1]}
						cantDisp=${BASH_REMATCH[2]}
					fi

					regExpDispReg="([^;]*);[^;]*$"
					if [[ $registro =~ $regExpDispReg ]];
					then
						disponibilidadRequerida=${BASH_REMATCH[1]}
					fi

					if [ !  ${arrayDisponibilidades[$idCombo]} ];
					then
						arrayDisponibilidades[$idCombo]=$cantDisp
					fi
					cantDisponibilidadArray=${arrayDisponibilidades[$idCombo]}
					if [ $cantDisponibilidadArray -eq 0 -o $disponibilidadRequerida -gt $cantDisponibilidadArray ];
					then
						mensaje="Falta de disponibilidad"
						resultadoGuardarNOK=`guardarNOK $registro $mensaje $archivo`
						let registrosNOK=registrosNOK+1
						let registrosNOKParcial=registrosNOKParcial+1
					fi

					if [ $disponibilidadRequerida -le $cantDisponibilidadArray ];
					then
						let cantDisponibilidadArray=cantDisponibilidadArray-disponibilidadRequerida
						arrayDisponibilidades[$idCombo]=$cantDisponibilidadArray
						resultadoGuardarOK=`guardarOK $registro $archivo $idCombo`
						let registrosOK=registrosOK+1
						let registrosOKParcial=registrosOKParcial+1
					fi

				else
					mensaje="No existe el evento solicitado"
					resultadoGuardarNOK=`guardarNOK $registro $mensaje $archivo`
					let registrosNOK=registrosNOK+1
					let registrosNOKParcial=registrosNOKParcial+1
				fi

		
			else
				#registro invalido
				resultadoGuardarNOK=`guardarNOK $registro $registroValido $archivo`
				let registrosNOK=registrosNOK+1
				let registrosNOKParcial=registrosNOKParcial+1
			fi
		done
		IFS=$old_IFS  
		"${GRABAR}" $log "Registro totales procesados en el archivo: $registrosTotalParcial"
		"${GRABAR}" $log "Registro OK procesados: $registrosOKParcial"
		"${GRABAR}" $log "Registro NOK procesados: $registrosNOKParcial"
		"${MOVER}" "${ACEPDIR}/${archivo}" "${PROCDIR}/${archivo}" "Reservar_B";
	else
		#Archivo invalido
		"${GRABAR}" $log "$archivoValido"
		"${MOVER}" "${ACEPDIR}/${archivo}" "${RECHDIR}/${archivo}" "Reservar_B";
	fi
done

"${GRABAR}" $log "Actualizacion del archivo de disponibilidad...."

for idCombo in "${!arrayDisponibilidades[@]}"
do
	`sed -i 's/^\('"$idCombo"';[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\)[^;]*\(;[^;]*\)/\1'${arrayDisponibilidades[$idCombo]}'\2/' $PROCDIR/combos.dis`
done


"${GRABAR}" $log "Archivos totales procesados: $cantArchivos"
"${GRABAR}" $log "Registro totales procesados: $registrosTotal"
"${GRABAR}" $log "Registro OK procesados: $registrosOK"
"${GRABAR}" $log "Registro NOK procesados: $registrosNOK"
"${GRABAR}" $log "Fin de Reservar_B"


